package com.sojson.config.datasource;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import com.sojson.util.ArrayUtil;
import com.sojson.util.StringUtil;
import com.sojson.util.threadLocal.CustomThreadLocalUtil;

/**
 * 动态数据源
 * 
 * @author liu
 * @date 2021-07-04
 */
public class CustomRoutingDataSource extends AbstractRoutingDataSource {

    /** 数据源名称集合 */
    private List<Object> dataSourceNames;

    /**
     * 初始化数据源池
     * 
     * @param sqlSessionFactoryName SqlSessionFactory类型Key
     * @param dataSourceName        默认数据源名称
     * @param dataSourcePool        数据源池
     */
    public CustomRoutingDataSource(Object sqlSessionFactoryName, Object dataSourceName,
        Map<Object, Object> dataSourcePool) {
        // 保存所有数据源的名称
        this.dataSourceNames = new ArrayList<>(dataSourcePool.keySet());
        // 设置数据源池
        super.setTargetDataSources(dataSourcePool);
        // 设置默认数据源
        super.setDefaultTargetDataSource(dataSourcePool.get(dataSourceName));
        // 数据源初始化
        super.afterPropertiesSet();
    }

    /**
     * 获取要使用的数据源
     */
    @Override
    protected Object determineCurrentLookupKey() {
        // 从缓存获取数据源
        Object obj = CustomThreadLocalUtil.getDataSource();
        if (StringUtil.isNotBlankObject(obj)) {
            return obj;
        }

        // 获取数据源类型名称,是否有选择类型,如果没有选择就使用默认的
        Object dataSourceType = CustomThreadLocalUtil.getDataSourceType();
        // 如果没有选择数据源就设置为默认数据源集合
        if (StringUtil.isBlankObject(dataSourceType)) {
            return null;
        }

        // 如果选择了数据源就随机抽一个并缓存
        obj = ArrayUtil.getRandom(dataSourceNames);
        // 缓存数据源
        CustomThreadLocalUtil.setDataSource(obj);
        return obj;
    }

}